package cn.ducis.macaw.core.staticflies.file;

import cn.ducis.macaw.util.types.StringUtil;

/**
 * @author Yellow
 *
 */
public class MapValue {

	/**
	 * 处理记录小文件索引的map值，前16个字符记录位置，中间记录块文件名称，最后记录块文件路径
	 */
	public static String valueMerge(int start, int end, String blockName, String dir) {
		return supIntHexString(Integer.toHexString(start)) + supIntHexString(Integer.toHexString(end)) + blockName
				+ dir;
	}

	/**
	 * 从记录小文件的Map值中分离出小文件在其所属块中的位置
	 * 
	 * @param mergeValue
	 * @return 存放开始结束位置的数字，结果数组先放start，再放end
	 */
	public static int[] getStartEnd(String mergeValue) {
		int start = Integer.parseInt(mergeValue.substring(0, 8), 16);
		int end = Integer.parseInt(mergeValue.substring(8, 16), 16);
		int[] result = { start, end };
		return result;
	}

	/**
	 * 从记录小文件的Map值中分离出小文件对应块文件的路径
	 * 
	 * @param mergeValue
	 * @return
	 */
	public static String getBlockPath(String mergeValue) {
		String blockName = mergeValue.substring(16, 16 + BlockFile.getBlocknamelenth());
		String dir = mergeValue.substring(16 + BlockFile.getBlocknamelenth(), mergeValue.length());
		return dir + "/" + blockName + BlockFile.getBlocksuffix();
	}

	/**
	 * 把由int转成的十六进制字符串不足8个字符的高位补0
	 * 
	 * @param intHex
	 * @return
	 */
	private static String supIntHexString(String intHex) {
		int zeroCount = 8 - intHex.length();
		StringBuilder str = new StringBuilder();
		for (int i = 0; i < zeroCount; i++) {
			str.append("0");
		}
		return str.append(intHex).toString();
	}

	/**
	 * 将两个int数合并在一个long型数中
	 * 
	 * @param highNum
	 *            存在高位的int数
	 * @param lowNum
	 *            存在低位的int数
	 * @return 合并后的long数值
	 */
	@Deprecated
	public static long twoIntToLong(int highNum, int lowNum) {
		return ((long) lowNum & 0xFFFFFFFFl) | (((long) highNum << 32) & 0xFFFFFFFF00000000l);
	}

	/**
	 * 将由两个int合并的long拆分
	 * 
	 * @param mergeNum
	 *            由两个int合并的long数值
	 * @return 大小为2的int数组，先放高32位，再放低32位
	 */
	@Deprecated
	public static int[] longToTwoInt(long mergeNum) {
		int[] temp = new int[2];
		temp[0] = (int) ((mergeNum & 0xFFFFFFFF00000000l) >> 32);
		temp[1] = (int) (mergeNum & 0xFFFFFFFFl);
		return temp;
	}

}
